﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Kopytko.BoardGame
{
    public class Ruch
    {
        private Pole PoczatekRuchu;
        private Pole KoniecRuchu;
        public Ruch(Pole skad, Pole dokad)
        {
            PoczatekRuchu = new Pole(skad);
            KoniecRuchu = new Pole(dokad);
        }
        public Ruch(Ruch pierwowzor)
        {
            PoczatekRuchu = new Pole(pierwowzor.GetSkad());
            KoniecRuchu = new Pole(pierwowzor.GetDokad());
        }
        public Pole GetSkad()
        {
            return new Pole(PoczatekRuchu);
        }
        public Pole GetDokad()
        {
            return new Pole(KoniecRuchu);
        }
        public static bool operator ==(Ruch a, Ruch b)
        {
            return a.GetSkad() == b.GetSkad() && a.GetDokad() == b.GetDokad();
        }
        public static bool operator !=(Ruch a, Ruch b)
        {
            return !(a == b);
        }
        public bool JestLegalny(Plansza plansza)
        {
            //Console.Out.Write("Badany ruch: ");
            //new Print(this);
            //Console.Out.WriteLine();
            if (this.JestRoszadaWLewo(plansza))
            {
                Figura RoszadujacaFigura = plansza.PobierzFigureZPola(this.GetSkad());
                Color RoszadujacyKolor = RoszadujacaFigura.GetKolor();
                if (plansza.PodDostepnymSzachem(RoszadujacyKolor)) return false;
                if (!new Ruch(this.GetSkad(), this.GetDokad() + new Pole(1, 0)).JestLegalny(plansza)) return false;
            }
            else if (this.JestRoszadaWPrawo(plansza))
            {
                Figura RoszadujacaFigura = plansza.PobierzFigureZPola(this.GetSkad());
                Color RoszadujacyKolor = RoszadujacaFigura.GetKolor();
                if (plansza.PodDostepnymSzachem(RoszadujacyKolor)) return false;
                if (!new Ruch(this.GetSkad(), this.GetDokad() + new Pole(-1, 0)).JestLegalny(plansza)) return false;
            }
            Plansza PlanszaSymulacyjna = new Plansza(plansza);
            PlanszaSymulacyjna.WykonajRuch(this);
            Figura ruszana = PlanszaSymulacyjna.PobierzFigureZPola(this.KoniecRuchu);
            return !PlanszaSymulacyjna.PodDostepnymSzachem(ruszana.GetKolor());
        }
        public bool JestRoszadaWLewo(Plansza plansza)
        {
            return (plansza.PobierzFigureZPola(this.PoczatekRuchu) is Krol
                    && this.PoczatekRuchu.GetX() - this.KoniecRuchu.GetX() == 2);
        }
        public bool JestRoszadaWPrawo(Plansza plansza)
        {
            return (plansza.PobierzFigureZPola(this.PoczatekRuchu) is Krol
                    && this.KoniecRuchu.GetX() - this.PoczatekRuchu.GetX() == 2);
        }
    }
}
